from pymodbus.client.sync import ModbusTcpClient
# from pymodbus.client import ModbusTcpClient
from pymodbus.exceptions import ModbusException
import numpy as np
import math

def PLCconnect(pic_w,pic_h,x1,x4,y1,y4,angle_w,angle_h):
    client = ModbusTcpClient('10.107.128.6',502)
    #创建一个ModbusClient实例，用于建立与Modbus设备的RTU通信
    #method参数设置为'rtu'以指定通信协议，port参数根据实际连接的串行端口进行设置
    #（例如Linux系统中可能是'/dev/ttyUSB0'，Windows中可能是'COM3'），baudrate参数设置传输速率，
    #这些参数应与设备文档或配置相匹配。
    if client.connect():##如果连接成功
        print("Modbus RTU Client Connected")
    else:
        print("Failed to connect to Modbus RTU Client")

    result = client.read_holding_registers(address=0,count=3,unit=1)
    #读取保持寄存器
    #读取地址为1的起始位置、数量为10的连续寄存器。unit参数表示从哪个单元（即设备ID）读取数据
    if not result.isError():
        print("Register Values: ", result.registers)
    else:
        print("Failed to read registers")
    #向设备的单个寄存器写入数据，可以使用以下代码
    write_response = client.write_register(address=1, value=25, unit=1)
    ##接受地址、要写入的值以及目标设备的单元ID
    if not write_response.isError():
        print("Written successfully")
    else:
        print("Failed to write register")
    #如果要写入多个寄存器，可以使用write_registers方法：
    #设左上角坐标为0，0，检测框左上角为x1y1,左下角为x2y2,右上角为x3y3,右下角为x4y4，中心点为（x1+x4)/2,(x1+x4)/2
    #假设镜头广度为120度，设图片像素为400*400，那么角度x就是tan x=(abs(（x1+x4)/2)-200)/(200/tan60)，
    #角度x=arctanx（(abs(（x1+x4)/2)-200)/(200/tan60)，取整，将这个数据传入寄存器

    Rotation_angle_w=round(math.atan2(abs((x1+x4)/2-pic_w-2), (pic_w/2/math.tan(angle_w))))
    zzf_w=0
    if(Rotation_angle_w>=0):zzf_w = 1;
    values = [Rotation_angle_w, zzf_w]
    write_response = client.write_registers(address=1, values=values, unit=2)
    if not write_response.isError():
        print("Multiple registers written successfully")
    else:
        print("Failed to write multiple registers")
    Rotation_angle_h=round(math.atan2(abs((y1+y4)/2-pic_h-2), (pic_h/2/math.tan(angle_h))))
    zzf_h=0
    if(Rotation_angle_h>=0):zzf_h = 1;
    values = [Rotation_angle_h, zzf_h]
    #处理异常

    try:
        # 尝试执行Modbus操作
        response = client.read_holding_registers(address=1, count=10, unit=1)
    except ModbusException as ex:
        print("An error occurred:", str(ex))
    client.close()